package mashibing.freshman.class01;

/**
 * 【阶乘计算】
 * 给定一个参数N，
 * 返回：  1! + 2! + 3! + 4! + … + N!   的结果
 */
public class Code02_SumOfFactorial {
	/**
	 * A 方案：每次都重新乘
	 * @param N
	 * @return
	 */
	public static long f1(int N) {
		long ans = 0;
		for (int i = 1; i <= N; i++) {
			ans += factorial(i);
		}
		return ans;
	}

	public static long factorial(int N) {
		long ans = 1;
		for (int i = 1; i <= N; i++) {
			ans *= i;
		}
		return ans;
	}

	/**
	 * B 方案：每次都用上一个结果乘N
	 * @param N
	 * @return
	 */
	public static long f2(int N) {
		long ans = 0;
		long cur = 1;
		for (int i = 1; i <= N; i++) {
			cur = cur * i;
			ans += cur;
		}
		return ans;
	}

	public static void main(String[] args) {
		int N = 10;
		System.out.println(f1(N));
		System.out.println(f2(N));
	}

}
